<?php


namespace app\index\server;


class BonusPaymentService extends BaseService
{
    /**
     * 接收支付后回调的订单号，进行团队奖金计算
     * @param $or_num
     * @return array
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function index($or_num)
    {
        $this->record($or_num);     //   插入消费记录
        $this->gongMoney($or_num);   //  供货商所得奖励
        $this->count($or_num);   // 计算团队奖励，并做记录
        return ['code'=>1,'msg'=>'成功'];

    }

    /**
     * 插入消费记录，并改变订单状态
     */
    public function record($or_num)
    {
        //  根据订单号，查询信息
        $orderInfo = model('order')->where('or_num', $or_num)->find();           //  订单信息
       // $orderDetailInfo = model('order_detail')->where('or_id', $orderInfo->id)->find();   // 订单详情信息
        $userInfo = model('user')->where('id', $orderInfo['us_id'])->find();     // 用户信息

        //  商品订单金额
        $product_value = model('order_detail')
            ->where('shopping_id',1)
            ->where('or_id',$orderInfo['id'])
            ->sum('or_pd_total');

        if ($or_num) {
            $pay_data = [
                'us_id' => $userInfo->id,               // 用户id
                'type'=> 1,                             // 1. 消费  2.团队奖 3. 提现
                'pay_type' => $orderInfo->pay_type,  // 支付方式
                'y_pay_money' => $userInfo->us_all_get,  // 原可用金额
                'y_frozen_money' => $userInfo->us_all_two_money,  // 原冻结金额
                'money' => $product_value,  // 订单金额（交易金额）
                'over_pay_money' => $userInfo->us_all_get,  // 剩余可用金额
                'over_frozen_money' => $userInfo->us_all_two_money,  // 剩余冻结金额
                'or_num' => $or_num,
                'or_id' => $orderInfo->id,
                'add_time' => date('Y-m-d H:i:s'),
                'explain'=>'购买商品'
            ];
            //  插入消费记录
            $insert = model('MoneyDetailed')->insert($pay_data);
            // 更新订单状态,和支付时间
            $pay_type = date('Y-m-d H:i:s');
            $update = model('order')->where('or_num', $or_num)->update(['or_status' => 1,'pay_time'=>$pay_type]);
            if ($insert && $update) {
                return ['code' => 1, 'msg' => '成功'];
            } else {
                return ['code' => 0, 'msg' => '失败'];
            }
        }
    }


    /**
     *  给供货商发奖励 / 发送到冻结钱包中
     */
    public function gongMoney($or_num)
    {
        $orderInfo = model('order')->where('or_num', $or_num)->find();     // 订单信息  (一个订单)
        $orderDetailInfo = model('order_detail')   // 订单详情信息 // 一个订单中有多个商品
        ->where('or_id', $orderInfo['id'])
            ->where('shopping_id',1)
            ->where('gong_id','<>',null)
            ->select();

        if (empty($orderDetailInfo)){
            return ['code' => 1, 'msg' => '成功'];
        }

        // 循环订单详情
        foreach ($orderDetailInfo as $k =>$v ){
            $productInfo =  model('product')->where('id', $v['pd_id'])->find(); // 商品信息
            $gongInfo = model('admin')->where('id', $productInfo['gong_id'])->find();  // 供应商信息
            model('admin')->where('id', $productInfo['gong_id'])->setInc('gong_money', $productInfo['gong_money']);
            $payGongInfo = model('admin')->where('id', $productInfo['gong_id'])->find();
            $pay_data = [
                'gong_id' => $gongInfo->id,     //  供应商id
                'y_pay_money' => $gongInfo->gong_pay_money,  //  原可交易金额
                'y_money' => $gongInfo->gong_money,     //  原冻结金额
                'money' => $productInfo->gong_money,    // 获取金额
                'over_pay_money' => $payGongInfo->gong_pay_money,   // 剩余可交易金额
                'over_money' => $payGongInfo->gong_money,   // 剩余冻结金额
                'us_id' => $orderInfo->us_id, // 用户id
                'or_id' => $orderInfo->id, // 订单id
                'addr_id' => $orderInfo->addr_id,   // 地址id
                'or_num' => $or_num,  // 订单号
                'product_id'=>$productInfo['id'],   //商品id
                'add_time' => date('Y-m-d H:i:s')
            ];
            model('MoneyGong')->insertGetId($pay_data);
            // 插入供应商发奖记录
        }
    }



    /**
     * 计算团队奖金
     * 1. 会员购买,升级并发奖金  2.店主购买，发奖金
     */
    public function count($or_num)
    {
        $orderInfo = model('order')->where('or_num', $or_num)->find();     // 订单信息
//        $orderDetailInfo = model('order_detail')->where('or_id', $orderInfo->id)->find();  //订单详情信息
        $userInfo = model('user')->where('id', $orderInfo['us_id'])->find();      // 用户信息
        $yun_money = model('Config')->where('key', 'yun_money')->value('value');      //  运营中心所拿奖励
        $dian_money = model('Config')->where('key', 'dian_money')->value('value');   // 店主所拿奖励
        $yun = $yun_money + $dian_money;   // 运营中心直推奖励

        //  用户上级角色信息    1.店主1000,    2.运营中心 1200,    3.会员、不存在
        $pIdInfo = model('user')->where('id', $userInfo->us_pid)->find();

        // 用户类型
        $user_type = $userInfo->us_type;   // 1 会员，2 店主，3 运营中心

        //  判断该用户上级是否存在运营中心,如果存在返回id,如果不存在返回0;

        $getFatherId = $this->getFatherId($userInfo->id); // 获取所有上级id

        if (!empty($getFatherId['data'])) {
            foreach ($getFatherId['data'] as $k => $v) {
                $usType[] = model('user')->where('id', $v)->value('us_type');
            }
            if (in_array('3', $usType)) {
                $yunId = $this->pidInfos($userInfo->id);
                $yunInfo = model('user')->where('id', $yunId)->find();
            } else {
                $yunId = 0;
            }
        } else {
            $yunId = 0;
        }

        if ($user_type == 1) {   // 够买着为会员
            model('User')->where('id', $userInfo['id'])->update(['us_type' => 2]);  //  升级为店主
            // 判断上级
            if ($pIdInfo['us_type'] == 1) {
                return ['code' => 1, 'msg' => '购买成功'];
            } elseif ($pIdInfo['us_type'] == 2) {
                model('User')->where('id', $pIdInfo['id'])->setInc('us_all_two_money', $dian_money);
                $this->teamMoney($or_num,$pIdInfo['id'],$dian_money,$pIdInfo->us_all_get,$pIdInfo->us_all_two_money,$userInfo->id,'会员升级店主,店主所得奖励');
                if ($yunId != 0) {
                    model('User')->where('id', $yunId)->setInc('us_all_two_money', $yun_money);
                    $this->teamMoney($or_num,$yunId,$yun_money,$yunInfo->us_all_get,$yunInfo->us_all_two_money,$userInfo->id,'会员升级店主，运营中心所得奖励');
                }
                return ['code' => 1, 'msg' => '购买成功'];

            } elseif ($pIdInfo['us_type'] == 3) {  // 直接发1200
                model('User')->where('id', $pIdInfo['id'])->setInc('us_all_two_money', $yun);
                $this->teamMoney($or_num,$pIdInfo['id'],$yun,$pIdInfo->us_all_get,$pIdInfo->us_all_two_money,$userInfo->id,'运营中心直推所得奖励');
            } else {
                return ['code' => 0, 'msg' => '用户角色类型错误'];
            }
        } elseif ($user_type == 2) {  // 购买者为店主（复购奖）
            // 判断上级
            if ($pIdInfo['us_type'] == 1) {
                return ['code' => 1, 'msg' => '购买成功'];
            } elseif ($pIdInfo['us_type'] == 2) {
                model('User')->where('id', $pIdInfo['id'])->setInc('us_all_two_money', $dian_money);
                $this->teamMoney($or_num,$pIdInfo['id'],$dian_money,$pIdInfo->us_all_get,$pIdInfo->us_all_two_money,$userInfo->id,'直推店主复购,所得奖励');
                if ($yunId != 0) {
                    model('User')->where('id', $yunId)->setInc('us_all_two_money', $yun_money);
                    $this->teamMoney($or_num,$yunId,$yun_money,$yunInfo->us_all_get,$yunInfo->us_all_two_money,$userInfo->id,'店主复购，运营中心所得奖励');
                }
                return ['code' => 1, 'msg' => '购买成功'];
            } elseif ($pIdInfo['us_type'] == 3) {   // 直接发1200
                model('User')->where('id', $pIdInfo['id'])->setInc('us_all_two_money', $yun);
                $this->teamMoney($or_num,$pIdInfo['id'],$yun,$pIdInfo->us_all_get,$pIdInfo->us_all_two_money,$userInfo->id,'运营中心直推用户复购所得奖励');
            } else {
                return ['code' => 0, 'msg' => '用户角色类型错误'];
            }
        } elseif ($user_type == 3) {   // 运营中心购买
            model('User')->where('id', $userInfo['id'])->setInc('us_all_two_money', $yun);
            $this->teamMoney($or_num,$userInfo['id'],$yun,$userInfo->us_all_get,$userInfo->us_all_two_money,$userInfo->id,'运营中心自己购买返利金额');
        } else {
            return ['code' => 0, 'msg' => '用户角色类型错误'];
        }

    }


    /**
     * 插入团队奖励
     */
    public function teamMoney($or_num, $id, $money,$y_one_money,$y_two_money,$layId, $description)
    {
        $orderInfo = model('order')->where('or_num', $or_num)->find();          //  订单信息
        $userInfo = model('user')->where('id', $id)->find();    // 用户信息
        if ($or_num) {
            $pay_data = [
                'us_id' => $id,    //  收益人id
                'type'=>2,      //1. 消费  2.团队奖 3. 提现
                'y_pay_money'=>$y_one_money,
                'y_frozen_money'=> $y_two_money,
                'money'=> $money,
                'over_pay_money'=> $userInfo->us_all_get,
                'over_frozen_money'=> $userInfo->us_all_two_money,
                'origin_id'=> $layId,
                'or_id'=> $orderInfo->id,
                'or_num' => $or_num,    // 订单号
                'explain'=>$description,
                'add_time' => date('Y-m-d H:i:s') // 收货前资金到账时间
            ];
            // 插入消费记录
            $insert = model('MoneyDetailed')->insert($pay_data);
            if ($insert) {
                return ['code' => 1, 'msg' => '成功'];
            } else {
                return ['code' => 0, 'msg' => '失败'];
            }
        }
    }


    // 根据用户id,查询改用户的运营中心id
    public function pidInfos($id)
    {
        $user = model('user')->where('id', $id)->find();
        $pUser = model('user')->where('id', $user->us_pid)->find();
        if ($pUser->us_type != 3) {
            return $this->pidInfos($pUser->id);
        }
        return $pUser->id;
    }


}